<?php 

class ocorrencia_mensagemModel extends Model{
    public $tabela = "ocorrencia_mensagem";
    public $pkey   = 'cod_mensagem';
    public $dados  = array(
         'cod_mensagem' => array(
	    'name'     => 'Mensagem',
	    'type'     => 'int',
	    'size'     => '11',
	    'pkey'    => true,
            'private' => true,
	    'ai'      => true,
	    'notnull' => true,
	    'grid'    => true,
	    'display' => true,
        ),
        
        'cod_ocorrencia' => array(
	    'name'     => 'Assunto',
	    'type'     => 'int',
	    'size'     => '11',
	    'notnull' => true,
	    'grid'    => true,
            'especial' => 'session',
            'session' => 'ocorrencia/ocorrencias',
            //'especial'=> 'session',
            //'session' => 'ocorrencias',
	    'display' => false,
	    'fkey' => array(
	        'model' => 'ocorrencia/ocorrencias',
	        'cardinalidade' => '1n',
	        'keys' => array('cod_ocorrencia', 'assunto'),
                'onupdate' => 'cascade',
                'ondelete' => 'cascade',
	    ),
            'feature' => array(
                'feature_name'  => 'OCORRENCIA_OCORRENCIAS',
                'feature_value' => 'true'
            )
        ),
        
        'cod_autor' => array(
	    'name'     => 'Autor',
	    'type'     => 'int',
	    'size'     => '11',
	    'notnull' => true,
	    'grid'    => true,
	    'display' => true,
            'especial' => 'autentication',
            'autentication' => array(
                'needlogin' => true
            ),
	    'fkey' => array(
	        //'model' => 'usuario/login',
                'model' => 'usuario/login',
	        'cardinalidade' => '1n',
	        'keys' => array('cod_usuario', 'user_name'),
                'onupdate' => 'cascade',
                'ondelete' => 'restrict'
	    ),
         ),
        
        'data' => array(
	    'name'     => 'Data',
	    'type'     => 'timestamp',
            'especial' => "hide",
	    'notnull' => true,
	    'grid'    => true,
	    'display' => true,
        ),
        
        'resposta' => array(
	    'name'     => 'Resposta',
	    'type'     => 'int',
	    'size'     => '11',
	    'display' => true,
	    /*'fkey' => array(
	        'model' => 'ocorrencia/mensagem',
	        'cardinalidade' => '1n',
	        'keys' => array('cod_mensagem', 'cod_mensagem'),
                'onupdate' => 'cascade',
                'ondelete' => 'cascade',
	    )*/
        ),
        
        
        'texto' => array(
	    'name'     => 'Nova Mensagem',
	    'type'     => 'text',
            'textlenght' => '256',
            'notnull'   => true,
            'especial' => 'editor',
            'editor'   => array('format', 'list', 'link', 'history'),
	    'grid'    => true,
	    'display' => true,
        ),

        'anexo' => array(
	    'name'     => 'Anexar Arquivos',
            'especial' => 'anexo',
            'anexo'    => array(
                'folder'    => '',
                'showform'  => true,
                'showfiles' => false
            )
            /*'feature' => array(
                'feature_name'  => 'OCORRENCIA_ANEXO',
                'feature_value' => 'true'
            )*/
        ),
        'has_anexo' => array(
           'name'      => 'Tem anexo',
           'descricao' => 'Esta mensagem contém anexo?',
           'type'      => 'enum',
           'especial'  => 'hide',
           'notnull'   => true,
           'default'   => 'n',
           'options' => array(
               's'   => "Sim",
               'n'   => 'Não',
           ),
           'display' => true,
           'private'   => true,
        ),
        'sistema' => array(
           'name'        => 'Mensagem do Sistema',
           'description' => 'Esta mensagem foi enviada pelo sistema?',
           'type'        => 'enum',
           'especial'    => 'hide',
           'notnull'     => true,
           'default'     => 'n',
           'options' => array(
               's'   => "Sim",
               'n'   => 'Não',
           ),
           'display' => true,
           'private' => true,
        ),
        
    );
    
    private $cod_usuario    = "";
    private $cod_ocorrencia = "";
    
    public function __construct() {
        parent::__construct();
        $this->LoadModel('usuario/login', 'uobj');
        //$this->LoadModel('usuario/login', 'uobj');
        $this->LoadModel('ocorrencia/envolvido', 'env');
        $this->LoadModel('ocorrencia/ocorrencias','oc');
        $this->cod_usuario = $this->uobj->getCodUsuario();
        
        if(isset($_SESSION['ocorrencia/ocorrencias'])){
            $this->dados['anexo']['anexo']['folder'] = "ocorrencia/ocorrencias/".$_SESSION['ocorrencia/ocorrencias'];
            $this->cod_ocorrencia = $_SESSION['ocorrencia/ocorrencias'];
        }
    }
    
    private $lastItem = array();
    public function getLastInsertedItem($cod_ocorrencia){
        $where   = "cod_autor = '$this->cod_usuario' AND cod_ocorrencia = '$cod_ocorrencia'";
        $campos = $this->getCampos();
        return $this->selecionar($campos, $where, 1, 0, 'cod_mensagem DESC');
    }
    
    private $ignore_status = false;
    public function ignore_status(){
        $this->ignore_status = true;
    }
    public function inserir($dados) {
        
        //verifica se a ocorrencia pode receber novas mensagens
        if(!$this->ignore_status){
            if(CURRENT_ACTION != 'reativar' && !$this->oc->can_post_message($this->cod_ocorrencia)){
                $this->setErrorMessage(MENSAGENS_BLOQUEADAS_PARA_STATUS_CONCLUIDO);
                return false;
            }
        }
        
        $temp = trim(Resume($dados['texto'], 10));
        if($temp == ""){
            $this->setErrorMessage("O texto da mensagem deve ser preenchido!");
            return false;
        }
        //$dados['cod_ocorrencia'] = @$_SESSION['ocorrencia/ocorrencias'];
        //salva os dados
        if(!parent::inserir($dados)) return false;
        
        //recupera os usuário a serem notificados
        $list = $this->getUsuariosANotificar();
        
        //anexa os arquivos enviados na ocorrencia
        $lastid = $this->getLastId();
        if(!$this->oc->nova_atualizacao($this->cod_ocorrencia)){
            $this->setAlertMessage($this->oc->getErrorMessage());
        }
        $this->ignore_status = false;
        $this->anexar_arquivos($lastid);
        $this->setSuccessMessage(MENSAGEM_ENVIADA);
        
        //Verifica se existe algum usuário a ser notificado
        $this->setMessage("is_editing", '0');
        if(empty($list)) {
            $this->setAlertMessage("Nenhum usuário selecionado para ser alertado");
            return true;
        }
        
        $alert      = "";
        $ocorrencia = $this->getOcorrenciaData();
        foreach($list as $ls){
            if(!$this->env->SetUnread($this->cod_ocorrencia, $ls, $lastid)){
                $alert .= $this->env->getAlertMessage();
            }
        }
        if($alert != "") $this->setAlertMessage ($alert);
        
        //notifica os usuários
        $this->notificar($ocorrencia, $list, $dados['texto']);
        $this->setSuccessMessage(MENSAGEM_ENVIADA);
        return true;
    }
    
    public function getAnexos($cod_mensagem){
        $this->LoadModel('ocorrencia/anexo', 'anx');
        return $this->anx->getAnexoPorMensagem($cod_mensagem);
    }
    
    //seleciona a ocorrencia que acabou de ser salva no banco de dados
    private function recoverLastId(){
        if(empty($this->post)) return "";
        $this->lastItem = $this->selecionar($this->getCampos(), 
                "cod_autor = '".$this->post['cod_autor']."' AND cod_ocorrencia = '".$this->post['cod_ocorrencia']."'"
                , 1, 0, 'cod_mensagem DESC'
        );
        return $this->lastItem[0]['cod_mensagem'];
    }

    private function anexar_arquivos($lastid){
        $this->LoadModel('ocorrencia/anexo', 'anx');
        if($this->anx->anexar($this->dados['anexo']['anexo']['folder'],$lastid)){
            $arr_['has_anexo'] = 's';
            parent::editar($lastid, $arr_);
        }else $this->setAlertMessage($this->anx->getErrorMessage());
    }
        
    private function notificar($ocorrencia, $list, $texto_msg){
        
        //seleciona os usuário à notificar
        if(empty($list)) return;
        $us = implode(",", $list);
        $users = $this->uobj->selecionar(array('email'), "cod_usuario IN ($us)");
        if(empty ($users)) return true;
        
        //gera a lista de emails
        $destinatarios = array();
        foreach($users as $u){$destinatarios[] = $u['email'];}
        if(empty ($destinatarios)) return true;
        return $this->sendNotify($ocorrencia, $destinatarios, $texto_msg);
    }
    
    private function getUsuariosANotificar(){
        
        $users = $this->env->selecionar(
                array('cod_usuario'), 
                "cod_ocorrencia = '$this->cod_ocorrencia' AND lida = 's' AND cod_usuario != '$this->cod_usuario'"
        );
        
        //usuarios que pertencem a ocorrencia e que já recebeu notificação de mudança na ocorrência
        $usuarios_a_alertar = array();
        foreach($users as $e) $usuarios_a_alertar[$e['cod_usuario']] = $e['cod_usuario'];
        return $usuarios_a_alertar;
    }
    
    private function sendNotify($ocorrencia, $destinatarios, $texto_msg){
        //recupera o email do autor da mensagem
        $user_send = $this->uobj->getItem($this->cod_usuario,"", false, array('email', 'user_name', 'user_cargo')); 
        $autor     = $user_send['email'];
        
        //gera os dados da notificacao
        $assunto    = $ocorrencia['assunto'];
        $texto      = $this->getTextoAlerta($ocorrencia, $autor, $texto_msg);
        
        //envia o alerta
        $this->LoadModel('contato/alertas', 'aobj');
        $this->aobj->alertar($assunto, $texto, $destinatarios, $user_send);
        $this->setErrorMessage($this->aobj->getErrorMessage());
        return true;
    }
    
    
    private function getOcorrenciaData(){
        //recupera a Discussão desta mensagem, para o assunto da notificação
        $pkey       = $this->oc->getPkey();
        $ocorrencia = $this->oc->selecionar(
                array('cod_ocorrencia','assunto'), 
                "$pkey = '$this->cod_ocorrencia'"
        );
        return array_shift($ocorrencia);
    }
    
    private function getTextoAlerta($ocorrencia, $autor, $texto_msg){
        
        //gera o texto da mensagem
        $this->LoadResource('html', 'html');
        $link    = $this->html->getLink('ocorrencia/ocorrencias/show/'.$ocorrencia['cod_ocorrencia']);
        $link2   = $this->html->getLink('ocorrencia/ocorrencias/status/unread');
        $texto   = "<h2>".NOVA_MENSAGEM_RECEBIDA_DO_USUARIO." $autor</h2>";
        $texto  .= (OCORRENCIA_MENSAGEM_SHOW_FULL_MSG)? $texto_msg:"";
        $texto  .= VISUALIZAR_MENSAGEM_NO_LINK." <a href='$link'>".CLIQUE_AQUI."</a><hr/>";
        $texto  .= VISUALIZAR_TODAS_AS_MENSAGENS. " <a href='$link2'>".CLIQUE_AQUI."</a>";
        return $texto;
    }
    
    public function getDados() {
        $var = parent::getDados();
        if(!$this->uobj->UserIsAdmin()) unset($var['destinatarios']);
        
        if(CURRENT_PAGE == "ocorrencia/mensagem/show/"){
            $var['resposta']['default'] = $_SESSION['ocorrencia/mensagem'];
            $var['resposta']['especial'] = 'hidden';
        }elseif(CURRENT_MODULE == "ocorrencia") unset($var['resposta']);
        
        return $var;
    }
        

    public function getSecurityDataFromMensagem($cod_mensagem){
        
        $this->LoadModel('ocorrencia/grupo', 'gobj');
        
        $octable = $this->oc->getTable();
        $etable  = $this->env->getTable();
        $this->db->Join($this->tabela, $octable, array('cod_ocorrencia'), array('cod_ocorrencia'), "INNER");
        $this->db->Join($octable, $etable, array('cod_ocorrencia'), array('cod_ocorrencia'), "INNER");
        $this->db->Join($octable, $this->gobj->getTable(), array('grupo'), array('cod_grupo'), "INNER");
        
        $where = "$this->tabela.cod_mensagem = '$cod_mensagem'";
        $dados = array('cod_grupo', "$this->tabela.cod_ocorrencia", "$etable.cod_usuario", 'tipo_envolvimento');
        $var = parent::selecionar($dados, $where);
        //echo $this->db->getSentenca();
        if(empty ($var)) return $var;
        return array_shift($var);
    }

    private $popup_arr = array(
        'cod_mensagem', 'has_anexo', 'sistema', 'u.email as cod_autor', 'u.cod_usuario as __cod_autor', 'data','texto'
    );
    public function getUnreadMessages($cod_usuario, $cod_ocorrencia){
        $where = $this->getMessagesJoin($cod_usuario, $cod_ocorrencia) . " AND lida = 'n'";
        return $this->selecionar($this->popup_arr, $where, 1, 0, 'data DESC');
    }
    
    public function getLastMessagesByOcorrencia($cod_usuario, $cod_ocorrencia, $lastid){
        $where = $this->getMessagesJoin($cod_usuario, $cod_ocorrencia) . " AND cod_mensagem > '$lastid'";
        return $this->selecionar($this->popup_arr, $where, 100, 0, 'cod_mensagem DESC');
    }
    
    private function getMessagesJoin($cod_usuario, $cod_ocorrencia){        
        $tbu = $this->uobj->getTable();
        $this->db->Join($this->tabela, "$tbu as u", array('cod_autor'), array('cod_usuario'), 'LEFT');
        return "cod_ocorrencia = '$cod_ocorrencia'";
    }
}
?>